﻿Imports FairShop
Imports FairShop.Objects
Imports FairShop.Operaties
Imports Microsoft.VisualStudio.TestTools.UnitTesting
Imports System
Imports System.Collections.Generic
Imports System.Data.OleDb
Imports System.IO
Imports System.Text

<TestClass()> _
Public Class TestLeveringen

    Private testContextInstance As TestContext

    Private _dsVoor As ArtikelsDataSet
    Private _dsNa As ArtikelsDataSet ' om data van na het bewaren van de levering te bekijken
    Private _leveringRij As ArtikelsDataSet.LeveringenRow
    Private _nieuwArtikel As ArtikelsDataSet.ArtikelsRow

    '''<summary>
    '''Gets or sets the test context which provides
    '''information about and functionality for the current test run.
    '''</summary>
    Public Property TestContext() As TestContext
        Get
            Return testContextInstance
        End Get
        Set(ByVal value As TestContext)
            testContextInstance = value
        End Set
    End Property

#Region "Additional test attributes"
    '
    ' You can use the following additional attributes as you write your tests:
    '
    ' Use ClassInitialize to run code before running the first test in the class
    <ClassInitialize()> _
    Public Shared Sub MyClassInitialize(ByVal testContext As TestContext)
        AppDomain.CurrentDomain.SetData("APPBASE", Environment.CurrentDirectory)
    End Sub
    '
    ' Use ClassCleanup to run code after all tests in a class have run
    ' <ClassCleanup()> Public Shared Sub MyClassCleanup()
    ' End Sub
    '
    ' Use TestInitialize to run code before running each test
    <TestInitialize()> _
    Public Sub MyTestInitialize()
        _dsVoor = New ArtikelsDataSet
        _dsNa = New ArtikelsDataSet
        _leveringRij = Nothing
        _nieuwArtikel = Nothing
    End Sub
    '
    ' Use TestCleanup to run code after each test has run
    <TestCleanup()> _
    Public Sub MyTestCleanup()
        ' opruimen
        For Each detailRij As ArtikelsDataSet.LeveringDetailsRow In _dsNa.LeveringDetails
            detailRij.Delete()
        Next
        Dim leveringDetailsAdapter As New ArtikelsDataSetTableAdapters.LeveringDetailsTableAdapter()
        leveringDetailsAdapter.Update(_dsNa.LeveringDetails)

        If (_leveringRij IsNot Nothing) Then
            _leveringRij.Delete()
            Dim leveringsAdapter As New ArtikelsDataSetTableAdapters.LeveringenTableAdapter
            leveringsAdapter.Update(_leveringRij)
        End If

        If (_nieuwArtikel IsNot Nothing) Then
            Dim updatedNieuwArtikel As ArtikelsDataSet.ArtikelsRow = (From a In Utility.Data.Artikels _
                                                                      Where a.Id = _nieuwArtikel.Id) _
                                                                      .First
            updatedNieuwArtikel.Delete() ' updated versie eerst opgehaald omdat je anders een concurrency-fout krijgt
            Dim artikelsAdapter As New ArtikelsDataSetTableAdapters.ArtikelsTableAdapter
            artikelsAdapter.Update(Utility.Data.Artikels)
        End If
    End Sub
    '
#End Region

#Region "Leveringen"

    <TestMethod()> _
    Public Sub TestLeveringBewaren()
        Dim dataCache As ArtikelsDataSet = Utility.Data ' op voorhand laden, zodat we later kunnen checken of hij up-to-date gebleven is

        Dim artikelsAdapter As New ArtikelsDataSetTableAdapters.ArtikelsTableAdapter
        artikelsAdapter.FillByBarcode(_dsVoor.Artikels, TestData.TEST_BARCODE)
        Dim beginVoorraad As Integer = _dsVoor.Artikels(0).VerwachteVoorraad
        Dim leveranciersRij As ArtikelsDataSet.LeveranciersRow = dataCache.Leveranciers.First
        Dim leveringRij As ArtikelsDataSet.LeveringenRow = dataCache.Leveringen.AddLeveringenRow(Today, leveranciersRij, "TESTFACTUURNR")

        _dsVoor.Artikels(0).Voorraad = TestData.TEST_AANTAL ' simuleer nieuwe levering

        Dal.LeveringToevoegen(leveringRij)
        Dal.LeveringBewaren(leveringRij, _dsVoor.Artikels)

        artikelsAdapter.FillByBarcode(_dsNa.Artikels, TestData.TEST_BARCODE)
        Dim eindVoorraad As Integer = _dsNa.Artikels(0).VerwachteVoorraad

        ' is de voorraad juist?
        Assert.AreEqual(beginVoorraad + TestData.TEST_AANTAL, eindVoorraad, "Foute eindvoorraad")
        ' ook de centrale datacache testen
        Dim artikelInCentraleDataCache As ArtikelsDataSet.ArtikelsRow = dataCache.Artikels.FindById(_dsNa.Artikels(0).Id)
        Assert.AreEqual(eindVoorraad, artikelInCentraleDataCache.VerwachteVoorraad, "Foute verwachte voorraad in centrale data-cache")

        Dim leveringDetailsAdapter As New ArtikelsDataSetTableAdapters.LeveringDetailsTableAdapter()
        leveringDetailsAdapter.FillByIdLevering(_dsNa.LeveringDetails, leveringRij.Id)
        Assert.AreEqual(TestData.TEST_AANTAL, _dsNa.LeveringDetails(0).Aantal, "Fout leveringsaantal")
    End Sub

    <TestMethod()> _
    Public Sub TestLeveringBijwerken()
        Dim dataCache As ArtikelsDataSet = Utility.Data ' op voorhand laden, zodat we later kunnen checken of hij up-to-date gebleven is

        Dim artikelsAdapter As New ArtikelsDataSetTableAdapters.ArtikelsTableAdapter
        artikelsAdapter.FillByBarcode(_dsVoor.Artikels, TestData.TEST_BARCODE)
        Dim beginVoorraad As Integer = _dsVoor.Artikels(0).VerwachteVoorraad
        Dim leveranciersRij As ArtikelsDataSet.LeveranciersRow = dataCache.Leveranciers.First
        Dim leveringRij As ArtikelsDataSet.LeveringenRow = dataCache.Leveringen.AddLeveringenRow(Today, leveranciersRij, "TESTFACTUURNR")

        _dsVoor.Artikels(0).Voorraad = TestData.TEST_AANTAL ' simuleer nieuwe levering

        Dal.LeveringToevoegen(leveringRij)
        Dal.LeveringBewaren(leveringRij, _dsVoor.Artikels)

        ' levering bijwerken
        _dsVoor.Artikels(0).Voorraad = TestData.TEST_AANTAL + 1

        Dal.LeveringBewaren(leveringRij, _dsVoor.Artikels)

        artikelsAdapter.FillByBarcode(_dsNa.Artikels, TestData.TEST_BARCODE)
        Dim eindVoorraad As Integer = _dsNa.Artikels(0).VerwachteVoorraad

        ' is de voorraad juist?
        Assert.AreEqual(beginVoorraad + TestData.TEST_AANTAL + 1, eindVoorraad, "Foute eindvoorraad")
        ' ook de centrale datacache testen
        Dim artikelInCentraleDataCache As ArtikelsDataSet.ArtikelsRow = dataCache.Artikels.FindById(_dsNa.Artikels(0).Id)
        Assert.AreEqual(eindVoorraad, artikelInCentraleDataCache.VerwachteVoorraad, "Foute verwachte voorraad in centrale data-cache")

        Dim leveringDetailsAdapter As New ArtikelsDataSetTableAdapters.LeveringDetailsTableAdapter()
        leveringDetailsAdapter.FillByIdLevering(_dsNa.LeveringDetails, leveringRij.Id)
        Assert.AreEqual(TestData.TEST_AANTAL + 1, _dsNa.LeveringDetails(0).Aantal, "Fout leveringsaantal")
    End Sub

    <TestMethod()> _
    Public Sub TestLeveringBewarenMetNieuwArtikel()
        Dim dataCache As ArtikelsDataSet = Utility.Data ' op voorhand laden, zodat we later kunnen checken of hij up-to-date gebleven is

        Dim beginVoorraad As Integer = 0
        Dim leveranciersRij As ArtikelsDataSet.LeveranciersRow = dataCache.Leveranciers.First
        Dim leveringRij As ArtikelsDataSet.LeveringenRow = dataCache.Leveringen.AddLeveringenRow(Today, leveranciersRij, "TESTFACTUURNR")
        Dal.LeveringToevoegen(leveringRij)

        _nieuwArtikel = _dsVoor.Artikels.NewArtikelsRow()
        _nieuwArtikel.Omschrijving = "Testartikel"
        _nieuwArtikel.Artikelcode = "Test123"
        _nieuwArtikel.Barcode = TestData.TEST_BARCODE2
        _nieuwArtikel.Verkoopbaar = True
        _nieuwArtikel.Voorraad = TestData.TEST_AANTAL ' simuleer nieuwe levering
        _nieuwArtikel.AantalPerVerpakking = 1
        _nieuwArtikel.Prijs = 5D
        _nieuwArtikel.StatiegeldEuro = 0D
        _nieuwArtikel.Inkoopprijs = 4D
        _nieuwArtikel.BTW = 6
        _nieuwArtikel.IdLeverancier = Constants.DEFAULT_LEVERANCIER_ID
        _nieuwArtikel.IsLeeggoed = False
        _nieuwArtikel.IsCheque = False
        _nieuwArtikel.IdCategorie = Constants.DEFAULT_CATEGORIE_ID
        _nieuwArtikel.VerwachteVoorraad = 0
        _nieuwArtikel.KortingLeverancier = 0
        _dsVoor.Artikels.AddArtikelsRow(_nieuwArtikel)

        Dal.LeveringBewaren(leveringRij, _dsVoor.Artikels)

        ' levering bijwerken
        _nieuwArtikel.Voorraad = TestData.TEST_AANTAL + 1

        Dal.LeveringBewaren(leveringRij, _dsVoor.Artikels)

        Dim artikelsAdapter As New ArtikelsDataSetTableAdapters.ArtikelsTableAdapter
        artikelsAdapter.FillByBarcode(_dsNa.Artikels, TestData.TEST_BARCODE2)
        Dim eindVoorraad As Integer = _dsNa.Artikels(0).VerwachteVoorraad

        ' is de voorraad juist?
        Assert.AreEqual(beginVoorraad + TestData.TEST_AANTAL + 1, eindVoorraad, "Foute eindvoorraad")
        ' ook de centrale datacache testen
        Dim artikelInCentraleDataCache As ArtikelsDataSet.ArtikelsRow = dataCache.Artikels.FindById(_dsNa.Artikels(0).Id)
        Assert.AreEqual(eindVoorraad, artikelInCentraleDataCache.VerwachteVoorraad, "Foute verwachte voorraad in centrale data-cache")

        Dim leveringDetailsAdapter As New ArtikelsDataSetTableAdapters.LeveringDetailsTableAdapter()
        leveringDetailsAdapter.FillByIdLevering(_dsNa.LeveringDetails, leveringRij.Id)
        Assert.AreEqual(TestData.TEST_AANTAL + 1, _dsNa.LeveringDetails(0).Aantal, "Fout leveringsaantal")
    End Sub

#End Region

End Class
